import Vue from "vue";
import $ from "jquery";

import {fs} from "../hos/fs.js";

/**
 * 此类的灵感来自安卓的Activity，处理一个页面的生命周期
 */
class Activity {

    /**
     * 构造函数，默认name为html的名字，同时也是id的前缀
     * @param {String} name
     */
    constructor(name) {
        this.name = name;

        this.id = "#" + name;
        this.next = null;
        this.prev = null;
        this.onceTimer = [];
        console.log(this.id + ":constructor");
    }

    /**
     * 使用该方式注册的timer,会在页面退出的的时候自动清除
     * @param {function} handler
     * @param {number} timeMs
     */
    setTimeout(handler, timeMs) {
        let timer;
        timer = window.setTimeout(()=>{
            this.clearTimeout(timer);
            handler();
        }, timeMs);
        this.onceTimer.push(timer);
        return timer;
    }

    /**
     * 清除通过setTimeout创建的定时器
     * @param timer
     */
    clearTimeout(timer) {
        for (const index in this.onceTimer) {
            if (this.onceTimer[index] === timer) {
                this.onceTimer.splice(index, 1);
            }
        }
        window.clearTimeout(timer);
    }

    /**
     * 创建实例，加载默认html
     */
    onCreate() {
        console.log(this.id + ":onCreate");
        $("#window").append(fs.cat("/static/html/" + this.name + ".html"));
        $(this.id).hide();
    }

    /**
     * 进入前台
     */
    onResume() {
        console.log(this.id + ":onResume");
        $(this.id).show();
    }

    /**
     * 进入后台
     */
    onPause() {
        console.log(this.id + ":onPause");
        $(this.id).hide();
    }

    /**
     * 处理返回事件，默认退回前一页
     */
    onBack() {
        console.log(this.id + ":onBack");
        if(this.prev) {
            this.finish();
        } else {
            // TODO 安卓平台可以在此实现连续点击两次退出应用
        }
    }

    /**
     * 现在只是简单地为id加前缀，未来可以实现修改html中的id前缀，从而实现对多实例的支持
     * @param {String} id
     */
    find(id) {
        return this.id + "_" + id;
    }

    /**
     * 页面被销毁，移除html
     */
    onDestroy() {
        console.log(this.id + ":onDestroy");
        this.prev = null;
        this.next = null;
        $(this.id).remove();

        for (const index in this.onceTimer) {
            window.clearTimeout(this.onceTimer[index]);
        }
        this.onceTimer = [];
    }

    /**
     * 结束当前页面
     * @param {*} intent 返回数据到前一个页面
     */
    finish(intent) {
        window.app.top = null;
        if (this.prev) {
            this.prev.intent = intent;
            this.prev.onResume();
            // TODO 添加转场动画
            window.app.top = this.prev;
        }
        this.onPause();
        this.onDestroy();
    }

    /**
     * 跳转页面
     * @param {Activity} activity
     * @param {*} intent 传递数据到新页面
     */
    jump(activity, intent) {
        window.app.top = null;
        this.next = activity;
        this.next.intent = intent;
        this.next.prev = this;
        this.next.onCreate();

        this.next.onResume();
        // TODO 添加转场动画
        this.onPause();
        window.app.top = this.next;
    }
}

export {Activity};
